#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifndef _IMAGE_H_
#define _IMAGE_H_

/* NAO ALTERAR ESTE ARQUIVO */

typedef struct _image {
  int *val; /* vetor com os valores dos brilhos. */
  int ncols, nrows; /* numero de colunas e linhas. */
} Image;

/* Cria uma nova imagem vazia. */
Image *CreateImage(int ncols, int nrows);

/* Destroi uma imagem e coloca NULL na variavel *img. */
void   DestroyImage(Image **img);

/* Carrega a imagem PGM P5 ou PGM P2. Considerar sempre
 * profundidade de 8 bits. */
Image *ReadImage(char *filename);

/* Imprime a imagem no formato PGM P2. Considerar sempre
 * profundidade de 8 bits. */
void   PrintImage(Image *img);
void   MovImage(Image *img);

/* Calcula a media dos brilhos. */
float  MeanValue(Image *img);

/* Calcula o negativo, alterando a propria imagem. */
void   Negative(Image *img);

/* Limiariza a imagem, alterando a propria imagem. Os valores
 * dos pixels da imagem limiarizada devem ser 0 ou 255. */
void   Threshold(Image *img, int thr);

/* Calcula o histograma normalizado da imagem e retorna
 * um vetor com os valores. O indice do vetor representa o
 * valor de brilho. */
float *Histogram(Image *img);

/* Calcula o histograma normalizado acumulado da imagem e retorna
 * um vetor com os valores. O indice do vetor representa o
 * valor de brilho. */
float *AccHistogram(Image *img);

/* Equaliza o histograma, alterando a propria imagem. */
void   HistogramEqualization(Image *img);

/* Recorta um retangulo representado pelos pontos (x0,y0) no
 * canto superior esquerdo e (x1,y1) no canto inferior
 * direito. Devolve o retangulo recortado como uma nova imagem,
 * sem alterar a imagem original. */
Image *CropRectangle(Image *img, int x0, int y0, int x1, int y1);

#endif
